home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / eshot / 4 / eshot.c next >
C/C++ Source or Header  |  2000-07-07  |  5KB  |  223 lines

  1. /* eshot.c */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>        /* sin,cos を使うために */
  6. #include <sys/iocs.h>
  7. #include "XSP2lib.H"
  8.  
  9. #define PCG_MAX    32        /* パターンデータの個数 */
  10.  
  11. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  12. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  13.  
  14. static unsigned short pal_dat[16][15];    /* パレットデータ */
  15.  
  16.  
  17. #define ESHOT_MAX    200    /* 敵弾最大数 */
  18. #define ESHOT_SPEED    0.75    /* 敵弾の速度 */
  19.  
  20.  
  21. /* 敵弾構造体 */
  22. typedef struct {
  23.     signed short x;        /* 敵弾のX座標 */
  24.     signed short y;        /*  〃 Y座標 */
  25.     unsigned char type;    /*  〃 種類(=0 なら未使用) */
  26.     signed int lx, ly;    /* 32bit X,Y 座標 ( l = longword ) */
  27.     signed int vx, vy;    /* 32bit X,Y 速度 ( v = velocity ) */
  28. } ESHOT;
  29.  
  30. ESHOT eshot[ESHOT_MAX];        /* 敵弾のワーク */
  31.  
  32.  
  33. typedef struct {
  34.     signed int x, y;
  35. } VECTOR;
  36.  
  37. VECTOR xytable[256];        /* sin,cos テーブル */
  38.  
  39.  
  40.  
  41. /* 関数プロトタイプ宣言 */
  42. void EshotFree (unsigned short);
  43.  
  44.  
  45.  
  46. /* ゲーム開始時に呼ばれる */
  47. void EshotInit (void)
  48. {
  49.     int i;
  50.  
  51.     for (i = 0; i < ESHOT_MAX; i++)
  52.         eshot[i].type = 0;    /* 全部未使用に */
  53. }
  54.  
  55.  
  56.  
  57. /* 敵弾出現時に呼ばれる */
  58. /* 引き数 : 種類, X座標, Y座標. 角度 */
  59. void EshotAlloc (unsigned short type, signed short x, signed short y, unsigned char angle)
  60. {
  61.     int i;
  62.  
  63.     for (i = 0; i < ESHOT_MAX; i++) {
  64.         /* 未使用のワークを見つける */
  65.         if (eshot[i].type == 0) {
  66.             /* 未使用のワークを見つけた */
  67.             eshot[i].lx = x * 65536;
  68.             eshot[i].ly = y * 65536;
  69.             eshot[i].vx = xytable[angle].x;
  70.             eshot[i].vy = xytable[angle].y;
  71.             eshot[i].type = type;
  72.             break;    /* for ループを抜ける */
  73.         }
  74.     }
  75. }
  76.  
  77.  
  78.  
  79. /* 垂直同期ごとに呼ばれる */
  80. void EshotMove (void)
  81. {
  82.     int i;
  83.  
  84.     for (i = 0; i < ESHOT_MAX; i++) {
  85.         /* そのワークは使用中か? */
  86.         if (eshot[i].type != 0) {
  87.             /* 使用中のワークを見つけた */
  88.             /* 座標に速度を足す */
  89.             eshot[i].lx += eshot[i].vx;    /* vx だけ移動 */
  90.             eshot[i].ly += eshot[i].vy;    /* vy だけ移動 */
  91.  
  92.             eshot[i].x = eshot[i].lx / 65536;    /* lx の整数部を取り出して x に */
  93.             eshot[i].y = eshot[i].ly / 65536;    /* ly の整数部を取り出して y に */
  94.  
  95.             /* 画面外にでたら敵弾を消去(未使用)に */
  96.             if ((eshot[i].x < 0) || (eshot[i].x > 256) || (eshot[i].y < 0) || (eshot[i].y > 256)) {
  97.                 EshotFree (i);
  98.             } else {
  99.                 /* 座標(eshot[i].x,eshot[i].y), スプライト No.type, パレット3, 優先順位 $3f */
  100.                 xsp_set (eshot[i].x, eshot[i].y, eshot[i].type, 0x033f);
  101.             }
  102.         }
  103.     }
  104. }
  105.  
  106.  
  107.  
  108. /* 敵弾消去時に呼ばれる */
  109. void EshotFree (unsigned short i)
  110. {
  111.     eshot[i].type = 0;    /* 未使用に */
  112. }
  113.  
  114.  
  115.  
  116. int main (int argc, char *argv[])
  117. {
  118.     FILE *fp;
  119.     int i, j;
  120.     int game_over = 0;
  121.     unsigned char angle = 0;    /* 次に撃つ弾の角度 */
  122.     unsigned char type = 1;    /* 次に撃つ弾の種類 */
  123.     int sprites;        /* スプライトの枚数 */
  124.  
  125.     if (argc != 1) {
  126.         printf (
  127.                    "敵弾テストその4 ESHOT.X\n"
  128.                    "        programmed by Mitsuky <FreeSoftware>\n"
  129.                    "弾のワークを構造体にしてみた\n"
  130.                    "&整数16bit+小数16bitの固定小数点を使ってみた\n"
  131.                    "&時計回りに弾が出るようにしてみた\n"
  132.             );
  133.         exit (-1);
  134.     }
  135.     printf ("データテーブルを作成します。\n");
  136.     for (i = 0; i < 256; i++) {
  137.         xytable[i].x = (signed int) (cos (2.0 * M_PI * (long) i / 256.0) * 65536.0 * ESHOT_SPEED);
  138.         xytable[i].y = (signed int) (sin (2.0 * M_PI * (long) i / 256.0) * 65536.0 * ESHOT_SPEED);
  139.     }
  140.  
  141.  
  142.     _iocs_crtmod (10);    /* 256x256ドット グラフィック画面 256色 2画面 */
  143.     _iocs_g_clr_on ();    /* グラフィック画面の初期化 */
  144.     _iocs_sp_init ();    /* スプライトの初期化 */
  145.     _iocs_sp_on ();
  146.  
  147.     /* pcg_dat にパターンデータを読み込む */
  148.     fp = fopen ("ESHOT.SP", "rb");
  149.     fread (pcg_dat, sizeof (char), PCG_MAX * 128, fp);
  150.     fclose (fp);
  151.  
  152.     /* pal_buf に一旦パレットデータを読み込む */
  153.     fp = fopen ("ESHOT.PAL", "rb");
  154.     fread (pal_dat, sizeof (unsigned short), 16 * 15, fp);
  155.     fclose (fp);
  156.     /* パレットデータを定義 */
  157.     /* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
  158.     {
  159.         unsigned short *p = (unsigned short *) pal_dat;
  160.         for (i = 1; i < 15; i++)
  161.             for (j = 0; j < 16; j++)
  162.                 _iocs_spalet (0x80000000 | j, i, *p++);
  163.     }
  164.  
  165.     xsp_on ();
  166.     xsp_mode (3);
  167.     /* パターンデータを定義 */
  168.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  169.  
  170.     /* グラフィック画面に線を引く */
  171.     {
  172.         struct _lineptr lp;
  173.         lp.x1 = 0;
  174.         lp.y1 = 128;
  175.         lp.x2 = 255;
  176.         lp.y2 = 128;
  177.         lp.color = 15;
  178.         lp.linestyle = 0xaaaa;
  179.         _iocs_line (&lp);
  180.         lp.x1 = 128;
  181.         lp.y1 = 0;
  182.         lp.x2 = 128;
  183.         lp.y2 = 255;
  184.         _iocs_line (&lp);
  185.     }
  186.  
  187.     printf ("ジョイスティックの\n"
  188.         " [B] ボタンを押すと弾を撃ちます\n"
  189.         " [A] ボタンを押すと終了します\n");
  190.  
  191.  
  192.     EshotInit ();
  193.  
  194.     do {
  195.         xsp_vsync (0);    /* 垂直同期待ち */
  196.         j = _iocs_joyget (0);    /* ジョイスティック0番 */
  197.  
  198.         /* [A] ボタンが押されたか? */
  199.         if ((j & 0b00100000) == 0)
  200.             game_over = !0;        /* ゲームオーバーに */
  201.  
  202.         /* [B] ボタンが押されたか? */
  203.         if ((j & 0b1000000) == 0) {
  204.             EshotAlloc (type, 144, 144, angle);    /* 種類 type の敵弾を座標(144,144)、角度 angle で発生 */
  205.             angle += 8;    /* 角度を進める */
  206.             type++;    /* 種類を進める(意味無し) */
  207.             if (type > 5)
  208.                 type = 1;
  209.         }
  210.         EshotMove ();
  211.         sprites = xsp_out ();    /* 表示 */
  212.  
  213.         printf ("弾数 = %3d  \n\x0b", sprites);
  214.         /* 0x0b はカーソルを1行上に移動する */
  215.         /* Human68K ユーザーズマニュアルの付録 ASCII 制御コードの欄参照 */
  216.     } while (!game_over);
  217.  
  218.     xsp_off ();
  219.  
  220.     _iocs_crtmod (16);
  221.     return (0);
  222. }
  223.